from django.core.management.base import BaseCommand
from django.db import transaction
from role.models import SysPermission, SysRole, SysRolePermission, SysUserRole
from user.models import SysUser


class Command(BaseCommand):
    help = '初始化系统权限数据和角色数据'

    def handle(self, *args, **options):
        """
        执行权限和角色数据初始化
        """
        try:
            with transaction.atomic():
                self.stdout.write('开始初始化权限数据...')
                self.init_permissions()
                
                self.stdout.write('开始初始化角色数据...')
                self.init_roles()
                
                self.stdout.write('开始分配用户角色...')
                self.assign_user_roles()
                
                self.stdout.write(
                    self.style.SUCCESS('权限和角色数据初始化完成！')
                )
        except Exception as e:
            self.stdout.write(
                self.style.ERROR(f'初始化失败: {str(e)}')
            )

    def init_permissions(self):
        """
        初始化系统权限数据
        """
        permissions = [
            # 系统管理模块
            {
                'name': '系统管理',
                'code': 'system',
                'type': 'M',
                'path': '/system',
                'icon': 'Setting',
                'component': '',
                'sort': 100,
                'parent_id': 0,
                'children': [
                    {
                        'name': '用户管理',
                        'code': 'system:user',
                        'type': 'C',
                        'path': '/system/user',
                        'icon': 'User',
                        'component': '/system/user/index',
                        'sort': 101,
                        'children': [
                            {
                                'name': '用户查询',
                                'code': 'system:user:query',
                                'type': 'F',
                                'path': '',
                                'icon': '',
                                'component': '',
                                'sort': 1,
                            },
                            {
                                'name': '用户新增',
                                'code': 'system:user:add',
                                'type': 'F',
                                'path': '',
                                'icon': '',
                                'component': '',
                                'sort': 2,
                            },
                            {
                                'name': '用户修改',
                                'code': 'system:user:edit',
                                'type': 'F',
                                'path': '',
                                'icon': '',
                                'component': '',
                                'sort': 3,
                            },
                            {
                                'name': '用户删除',
                                'code': 'system:user:delete',
                                'type': 'F',
                                'path': '',
                                'icon': '',
                                'component': '',
                                'sort': 4,
                            },
                            {
                                'name': '重置密码',
                                'code': 'system:user:resetpwd',
                                'type': 'F',
                                'path': '',
                                'icon': '',
                                'component': '',
                                'sort': 5,
                            }
                        ]
                    },
                    {
                        'name': '角色管理',
                        'code': 'system:role',
                        'type': 'C',
                        'path': '/system/role',
                        'icon': 'UserFilled',
                        'component': '/system/role/index',
                        'sort': 102,
                        'children': [
                            {
                                'name': '角色查询',
                                'code': 'system:role:query',
                                'type': 'F',
                                'path': '',
                                'icon': '',
                                'component': '',
                                'sort': 1,
                            },
                            {
                                'name': '角色新增',
                                'code': 'system:role:add',
                                'type': 'F',
                                'path': '',
                                'icon': '',
                                'component': '',
                                'sort': 2,
                            },
                            {
                                'name': '角色修改',
                                'code': 'system:role:edit',
                                'type': 'F',
                                'path': '',
                                'icon': '',
                                'component': '',
                                'sort': 3,
                            },
                            {
                                'name': '角色删除',
                                'code': 'system:role:delete',
                                'type': 'F',
                                'path': '',
                                'icon': '',
                                'component': '',
                                'sort': 4,
                            },
                            {
                                'name': '分配权限',
                                'code': 'system:role:permission',
                                'type': 'F',
                                'path': '',
                                'icon': '',
                                'component': '',
                                'sort': 5,
                            }
                        ]
                    },
                    {
                        'name': '菜单管理',
                        'code': 'system:menu',
                        'type': 'C',
                        'path': '/system/menu',
                        'icon': 'Menu',
                        'component': '/system/menu/index',
                        'sort': 103,
                        'children': [
                            {
                                'name': '菜单查询',
                                'code': 'system:menu:query',
                                'type': 'F',
                                'path': '',
                                'icon': '',
                                'component': '',
                                'sort': 1,
                            },
                            {
                                'name': '菜单新增',
                                'code': 'system:menu:add',
                                'type': 'F',
                                'path': '',
                                'icon': '',
                                'component': '',
                                'sort': 2,
                            },
                            {
                                'name': '菜单修改',
                                'code': 'system:menu:edit',
                                'type': 'F',
                                'path': '',
                                'icon': '',
                                'component': '',
                                'sort': 3,
                            },
                            {
                                'name': '菜单删除',
                                'code': 'system:menu:delete',
                                'type': 'F',
                                'path': '',
                                'icon': '',
                                'component': '',
                                'sort': 4,
                            }
                        ]
                    }
                ]
            },
            # 内容管理模块
            {
                'name': '内容管理',
                'code': 'content',
                'type': 'M',
                'path': '/content',
                'icon': 'Document',
                'component': '',
                'sort': 200,
                'parent_id': 0,
                'children': [
                    {
                        'name': '文章管理',
                        'code': 'content:article',
                        'type': 'C',
                        'path': '/content/article',
                        'icon': 'Edit',
                        'component': '/content/article/index',
                        'sort': 201,
                        'children': [
                            {
                                'name': '文章查询',
                                'code': 'content:article:query',
                                'type': 'F',
                                'path': '',
                                'icon': '',
                                'component': '',
                                'sort': 1,
                            },
                            {
                                'name': '文章新增',
                                'code': 'content:article:add',
                                'type': 'F',
                                'path': '',
                                'icon': '',
                                'component': '',
                                'sort': 2,
                            },
                            {
                                'name': '文章修改',
                                'code': 'content:article:edit',
                                'type': 'F',
                                'path': '',
                                'icon': '',
                                'component': '',
                                'sort': 3,
                            },
                            {
                                'name': '文章删除',
                                'code': 'content:article:delete',
                                'type': 'F',
                                'path': '',
                                'icon': '',
                                'component': '',
                                'sort': 4,
                            }
                        ]
                    },
                    {
                        'name': '分类管理',
                        'code': 'content:category',
                        'type': 'C',
                        'path': '/content/category',
                        'icon': 'Collection',
                        'component': '/content/category/index',
                        'sort': 202,
                        'children': [
                            {
                                'name': '分类查询',
                                'code': 'content:category:query',
                                'type': 'F',
                                'path': '',
                                'icon': '',
                                'component': '',
                                'sort': 1,
                            },
                            {
                                'name': '分类新增',
                                'code': 'content:category:add',
                                'type': 'F',
                                'path': '',
                                'icon': '',
                                'component': '',
                                'sort': 2,
                            },
                            {
                                'name': '分类修改',
                                'code': 'content:category:edit',
                                'type': 'F',
                                'path': '',
                                'icon': '',
                                'component': '',
                                'sort': 3,
                            },
                            {
                                'name': '分类删除',
                                'code': 'content:category:delete',
                                'type': 'F',
                                'path': '',
                                'icon': '',
                                'component': '',
                                'sort': 4,
                            }
                        ]
                    }
                ]
            },
            # 基础权限
            {
                'name': '首页',
                'code': 'dashboard',
                'type': 'C',
                'path': '/dashboard',
                'icon': 'House',
                'component': '/dashboard/index',
                'sort': 1,
                'parent_id': 0,
                'children': []
            },
            {
                'name': '个人中心',
                'code': 'profile',
                'type': 'C',
                'path': '/profile',
                'icon': 'User',
                'component': '/profile/index',
                'sort': 999,
                'parent_id': 0,
                'children': []
            }
        ]
        
        self._create_permissions(permissions, 0)

    def _create_permissions(self, permissions, parent_id):
        """
        递归创建权限数据
        """
        for perm_data in permissions:
            # 检查权限是否已存在
            permission, created = SysPermission.objects.get_or_create(
                code=perm_data['code'],
                defaults={
                    'name': perm_data['name'],
                    'type': perm_data['type'],
                    'path': perm_data.get('path', ''),
                    'icon': perm_data.get('icon', ''),
                    'component': perm_data.get('component', ''),
                    'sort': perm_data.get('sort', 0),
                    'parent_id': parent_id,
                    'status': 0
                }
            )
            
            if created:
                self.stdout.write(f'  创建权限: {permission.name}')
            else:
                self.stdout.write(f'  权限已存在: {permission.name}')
            
            # 递归创建子权限
            if 'children' in perm_data and perm_data['children']:
                self._create_permissions(perm_data['children'], permission.id)

    def init_roles(self):
        """
        初始化系统角色
        """
        # 获取所有权限
        all_permissions = SysPermission.objects.filter(status=0)
        
        # 超级管理员权限（全部权限）
        admin_permissions = list(all_permissions)
        
        # 普通管理员权限（排除系统设置相关的删除权限）
        manager_permissions = all_permissions.exclude(
            code__in=['system:user:delete', 'system:role:delete', 'system:menu:delete']
        )
        
        # 普通用户权限（只有基础查看权限）
        user_permissions = all_permissions.filter(
            code__in=['dashboard', 'profile', 'content:article:query', 'content:category:query']
        )
        
        # 创建角色数据
        roles_data = [
            {
                'name': '超级管理员',
                'code': 'super_admin',
                'description': '系统超级管理员，拥有所有权限',
                'sort': 1,
                'permissions': admin_permissions
            },
            {
                'name': '普通管理员', 
                'code': 'admin',
                'description': '普通管理员，拥有部分管理权限',
                'sort': 2,
                'permissions': manager_permissions
            },
            {
                'name': '普通用户',
                'code': 'user',
                'description': '普通用户，拥有基础权限',
                'sort': 3,
                'permissions': user_permissions
            }
        ]
        
        for role_data in roles_data:
            # 创建或获取角色
            role, created = SysRole.objects.get_or_create(
                name=role_data['name'],
                defaults={
                    'description': role_data['description'],
                    'sort': role_data['sort'],
                    'status': 0
                }
            )
            
            if created:
                self.stdout.write(f'  创建角色: {role.name}')
            else:
                self.stdout.write(f'  角色已存在: {role.name}')
                # 清除原有权限
                SysRolePermission.objects.filter(role=role).delete()
            
            # 分配权限
            for permission in role_data['permissions']:
                SysRolePermission.objects.get_or_create(
                    role=role,
                    permission=permission
                )
            
            self.stdout.write(f'    为角色 {role.name} 分配了 {len(role_data["permissions"])} 个权限')

    def assign_user_roles(self):
        """
        为指定用户分配角色
        """
        # 获取角色
        try:
            super_admin_role = SysRole.objects.get(name='超级管理员')
            admin_role = SysRole.objects.get(name='普通管理员')
            user_role = SysRole.objects.get(name='普通用户')
        except SysRole.DoesNotExist as e:
            self.stdout.write(f'角色不存在: {e}')
            return
        
        # 用户角色分配配置
        user_role_assignments = [
            {
                'username': 'linge001',
                'role': super_admin_role,
                'description': '设置为超级管理员'
            },
            {
                'username': 'linge002', 
                'role': admin_role,
                'description': '设置为普通管理员'
            }
        ]
        
        for assignment in user_role_assignments:
            try:
                user = SysUser.objects.get(username=assignment['username'])
                
                # 清除用户原有角色
                SysUserRole.objects.filter(user_id=user.id).delete()
                
                # 分配新角色
                user_role_obj, created = SysUserRole.objects.get_or_create(
                    user_id=user.id,
                    role=assignment['role']
                )
                
                if created:
                    self.stdout.write(f'  为用户 {user.username} {assignment["description"]}')
                else:
                    self.stdout.write(f'  用户 {user.username} 已经是 {assignment["role"].name}')
                    
            except SysUser.DoesNotExist:
                self.stdout.write(f'  警告: 用户 {assignment["username"]} 不存在，跳过角色分配')
                continue
        
        # 为其他用户分配普通用户角色
        other_users = SysUser.objects.exclude(
            username__in=['linge001', 'linge002']
        )
        
        for user in other_users:
            # 检查用户是否已有角色
            if not SysUserRole.objects.filter(user_id=user.id).exists():
                SysUserRole.objects.create(user_id=user.id, role=user_role)
                self.stdout.write(f'  为用户 {user.username} 设置为普通用户')